Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/backend/demo_mode.py master (b89dc9e6) Text, 2.68 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Public demo mode: read-only mesh and default-deny HTTP mutations."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787os
Tff7b72from T7ee787typing Tff7b72import Te6edf3TYPE_CHECKING

Tff7b72from T7ee787aiohttp Tff7b72import Te6edf3web

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787env_utils Tff7b72import Te6edf3env_bool

Tff7b72if Te6edf3TYPE_CHECKINGTb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat

Te6edf3DEMO_READONLY_CODE Tff7b72= Ta5d6ff"Ta5d6ffdemo_readonlyTa5d6ff"

Te6edf3DEMO_HTTP_MUTATION_ALLOWLISTTb4b4b4: Tffa657frozensetTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tffa657frozensetTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ff/api/v1/auth/loginTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff/api/v1/auth/logoutTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff/api/v1/auth/setupTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff/api/v1/app/tutorial/seenTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff/api/v1/app/changelog/seenTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8ffdemo_mode_from_envTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Te6edf3env_boolTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_DEMO_MODETa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)


Tff7b72def Td2a8ffauth_bypass_from_envTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Te6edf3env_boolTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_AUTH_BYPASSTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)


Tff7b72def Td2a8ffdemo_auth_password_from_envTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_DEMO_AUTH_PASSWORDTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdemoTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8ffnormalize_api_pathTb4b4b4(Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if Tff7b72not Te6edf3pathTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff/api/Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3path
Te6edf3parts Tff7b72= Tb4b4b4[Te6edf3p Tff7b72for Te6edf3p Tff7b72in Te6edf3pathTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3pTb4b4b4]
Tff7b72return Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3partsTb4b4b4)


Tff7b72def Td2a8ffdemo_mode_activeTb4b4b4(Te6edf3appTb4b4b4: Te6edf3ReticulumMeshChatTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Tffa657boolTb4b4b4(Tffa657getattrTb4b4b4(Te6edf3appTb4b4b4, Ta5d6ff"Ta5d6ffdemo_modeTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ffdemo_mode_blocks_ws_typeTb4b4b4(Te6edf3appTb4b4b4: Te6edf3ReticulumMeshChatTb4b4b4, Te6edf3msg_typeTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Tff7b72not Te6edf3demo_mode_activeTb4b4b4(Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787websocket_config_guard Tff7b72import Te6edf3WEBSOCKET_MUTATOR_TYPES

Tff7b72return Te6edf3msg_type Tff7b72in Te6edf3WEBSOCKET_MUTATOR_TYPES


Tff7b72def Td2a8ffdemo_mode_block_responseTb4b4b4(Te6edf3appTb4b4b4: Te6edf3ReticulumMeshChatTb4b4b4) Tff7b72-Tff7b72> Te6edf3webTff7b72.Td2a8ffResponse Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3demo_mode_activeTb4b4b4(Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3webTff7b72.Td2a8ffjson_responseTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffDemo mode is read-onlyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcodeTa5d6ff"Tb4b4b4: Te6edf3DEMO_READONLY_CODETb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3statusTff7b72=T79c0ff403Tb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8ffdemo_http_mutation_allowedTb4b4b4(Te6edf3methodTb4b4b4: Tffa657strTb4b4b4, Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Te6edf3methodTff7b72.Td2a8ffupperTb4b4b4(Tb4b4b4) Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffGETTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHEADTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffOPTIONSTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Te6edf3methodTff7b72.Td2a8ffupperTb4b4b4(Tb4b4b4) Tff7b72not Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffPUTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffPATCHTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffDELETETa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Te6edf3normalized Tff7b72= Te6edf3normalize_api_pathTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3normalizedTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff/api/v1/Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Te6edf3normalized Tff7b72in Te6edf3DEMO_HTTP_MUTATION_ALLOWLIST


Tff7b72def Td2a8ffcreate_demo_mode_middlewareTb4b4b4(Te6edf3appTb4b4b4: Te6edf3ReticulumMeshChatTb4b4b4)Tb4b4b4:
Tf0883e@webTff7b72.Td2a8ffmiddleware
Tff7b72async Tff7b72def Td2a8ffdemo_mode_middlewareTb4b4b4(Te6edf3requestTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3demo_mode_activeTb4b4b4(Te6edf3appTb4b4b4) Tff7b72and Tff7b72not Te6edf3demo_http_mutation_allowedTb4b4b4(
Te6edf3requestTff7b72.Td2a8ffmethodTb4b4b4,
Te6edf3requestTff7b72.Td2a8ffpathTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3webTff7b72.Td2a8ffjson_responseTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffDemo mode is read-onlyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcodeTa5d6ff"Tb4b4b4: Te6edf3DEMO_READONLY_CODETb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3statusTff7b72=T79c0ff403Tb4b4b4,
Tb4b4b4)
Tff7b72return Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3requestTb4b4b4)

Tff7b72return Te6edf3demo_mode_middleware


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────